#1 类的权限控制
class Student:  # 括号可省略
    def __init__(self, name, age, gender):
        self._name = name     # self._name受保护的，只能本类和子类访问
        self.__age = age      # self.__age表示私有的，只能类本身去访问
        self.gender = gender  # 普通的实例属性，类的内部、外部，及子类都可以访问

    def _fun1(self):    #受保护的方法
        print('子类及本身可访问')
    def __fun2(self):   # 私有的实例方法
        print('只有类本身可访问')
    def show(self):     # 普通的实例方法
        self._fun1()    # 类本身，访问受保护的方法
        self.__fun2()   # 类本身，访问私有的方法
        print(self._name)   # 受保护的属性
        print(self.__age)   #私有的属性


stu1 = Student('张三', 18, '男')
print(stu1._name)
#print(stu1.__age)   # 私有属性不可被外部访问 AttributeError: 'Student' object has no attribute '__age'. Did you mean: '_name'?
print(stu1._Student__age)  #外部访问私有属性，需要加上类名
stu1._fun1()
#stu1.__fun2()       # 私有方法不可被外部访问 AttributeError: 'Student' object has no attribute '__fun2'. Did you mean: '_fun1'?
stu1._Student__fun2()  #外部访问私有方法，需要加上类名

#2 遍历类的所有属性和方法
print(dir(stu1))    # "['_Student__age', '_Student__fun2'..."可知访问私有属性和方法的代码

#3 属性的设置
class humen:
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender  # 私有属性
    # 使用@property修改方法，将方法转成属性
    @property
    def gender(self):
        return self.__gender

    # 将gender这个属性设置为可写属性
    @gender.setter
    def gender(self, value):
        self.__gender = value

hum1 = humen('韩梅梅', '女')
print(hum1.name, hum1.gender)   # 可以直接访问私有属性
hum1.gender = '男'               # 可以直接更改私有属性
print(hum1.name, hum1.gender)



